package com.xff.service;

import com.xff.dao.LoginDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.io.FileInputStream;
import java.io.FileNotFoundException;

@Service
public class LoginService {

    @Autowired
    private LoginDao loginDao;

    /*
     * propagation:传播特性：表示不同的事务之间执行的关系
     *            REQUIRED:如果有事务在运行，当前的方法就在这个事务内运行，
     *                     否则，就启动一个新的事务，并在自己的事务内运行。
     *            REQUIRED NEW：当前的方法必须启动新事务，并在它自己的事务内运行.
     *                          如果有事务正在运行，应该将它挂起。
     *            SUPPORTS：如果有事务在运行，当前的方法就在这个事务内运行.否则它可以不运行在事务中.
     *            NOT_SUPPORTED：当前的方法不应该运行在事务中，如果有运行的事务，将它挂起。
     *            MANDATORY：当前的方法必须运行在事务内部，如果没有正在运行的事务,就抛出异常。
     *            NEVER：当前的方法不应该运行在事务中，如果有运行的事务，就抛出异常。
     *            NESTED：如果有事务在运行，当前的方法就应该在这个事务的嵌套事务内运行，
     *                    否则，就启动一个新的事务，并在它自己的事务内运行。
     *
     * isolation:隔离级别：4种隔离级别，会引发不同的数据错乱问题
     * timeout：超时时间,
     * readonly：只读事务:如果配置了只读事务，那么在事务运行期间，不允许对数据进行修改，否则抛出异常
     *
     * 设置哪些异常不会回滚数据
     * noRollBackfor: noRollbackFor = {ArithmeticException.class}
     * noRollbackForClassName:
     *
     * 设置哪些异常回滚
     * rollBackfor:
     * rollbackForClassName
     * */
    /*@Transactional(noRollbackFor = {ArithmeticException.class},
            rollbackForClassName = {"java.io.FileNotFoundException"},isolation = Isolation.DEFAULT)*/
    @Transactional(propagation = Propagation.REQUIRED)
    public void update() throws FileNotFoundException {
        loginDao.update1("lisi",5);
        loginDao.update2("kmj",6);
        int s=1/0;
        /*new FileInputStream("222.txt");*/
    }

    @Transactional
    public void update2(){
        loginDao.update3("qwe",7);
    }
}
